package com.ww.basic.oop

/**
 * 参数化类
 *
 * @param content
 * @tparam T
 */
class Message[T](val content: T) {
  override def toString = s"message content is $content"

  def is(value: T): Boolean = value == content
}

object Parameterized {
  /**
   * 参数化函数
   *
   * @param input1
   * @param input2
   * @tparam T
   */
  def echo[T](input1: T, input2: T): Unit =
    println(s"got $input1 (${input1.getClass}) $input2 (${input2.getClass})")

  def main(args: Array[String]): Unit = {
    echo("hello", "there")
    echo(4, 5)

    /**
     * 打印结果
     * got hello (class java.lang.String) 5 (class java.lang.Integer)
     */
    echo("hello", 5)

    // 为了避免这种情况，可以写成如下形式
    //    echo[Int]("hello", 5) // 直接报错Type mismatch
    echo[Int](3, 5)

    /**
     * 使用参数化类型
     */
    val message1: Message[String] = new Message("hello ketty")
    val message2 = new Message(42)

    /**
     * 打印结果
     * message content is hello ketty
     * true
     * false
     * false
     */
    println(message1)
    println(message1.is("hello ketty"))
    println(message1.is("hi"))
    println(message2.is(22))
  }
}
























